﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using Tibet.Entidades;
using Tibet.Logica.FabricaLogica;
using Tibet.Logica.Interfaces.MotorRegla;

namespace Tibet.Logica.Comandos.ComandoMotorRegla
{
    public class ConsultarNombreInterfaceINombreinter : ConsultarNombreInterface, IConsultarNombreInterface
    {
        public override void Ejecutar()
        /*Valida el nombre de la clase empiece con I mayuscula, y la siguiente con mayuscula.
        Ejemplo: INombreinterface      
        */
        {
            //Variables iniciales
            int AnchoLinea; //Guardara el tamaño de cada linea del archivo.
            int i = 0;      //Contador de iteraciones para los ciclos (for).
            int LineaActual = 0; //Linea actual que se esta leyendo.
            Resultado Resp = new Resultado(); //Objeto resultado que sera retornado.

            //Inicializamos Resp asumiendo que el archivo cumple con la regla.
            Resp.Fecha = new DateTime();
            Resp.Fecha = DateTime.Now;
            Resp.Respuesta = true;
            Resp.Mensaje = "No se encontraron errores";
            Resp.Linea = 0;

            try
            {
                List<EntidadString> listaStr = new List<EntidadString>();

                for (int j = 0; j < ListaEntidad.Count; j++)
                {
                    listaStr.Add((EntidadString)ListaEntidad.ElementAt(j));
                }


                foreach (EntidadString linea in listaStr)   //Recorro la lista linea por linea
                {
                    LineaActual++;                //Aumenta el contador de la linea.
                    if (linea.Linea.Length != 0)        //Si la linea no esta vacia.
                    {
                        AnchoLinea = linea.Linea.Length;//Guardamos la cantidad de espacios de la linea.
                        i = 0;                    //Reiniciamos el contador.
                        while (i < AnchoLinea)    //Recorremos la linea caracter por caracter.
                        {
                            if (linea.Linea[i] == 'i') // Si encontramos un abrir de interface, de alli se compara cada letra de la palabra interface
                            {
                                if (linea.Linea[i + 1] == 'n')
                                {
                                    if (linea.Linea[i + 2] == 't')
                                    {
                                        if (linea.Linea[i + 3] == 'e')
                                        {
                                            if (linea.Linea[i + 4] == 'r')
                                            {
                                                if (linea.Linea[i + 5] == 'f')
                                                {
                                                    if (linea.Linea[i + 6] == 'a')
                                                    {
                                                        if (linea.Linea[i + 7] == 'c')
                                                        {
                                                            if (linea.Linea[i + 8] == 'e')
                                                            {
                                                                if (linea.Linea[i + 9] == ' ') //se compara que exista espacio en blacno entre interface y el nobre de la interface
                                                                {
                                                                    int j = 10;
                                                                    int cont;
                                                                    string inicial = linea.Linea[j].ToString();
                                                                    string nombreInterface = linea.Linea[j + 1].ToString();
                                                                    string mayuscula = nombreInterface.ToUpper();
                                                                    string nombre = "I";
                                                                    bool x = inicial.Equals(nombre);
                                                                    bool y = nombreInterface.Equals(mayuscula);
                                                                    if (x == true) //valida que inicie en I Mayuscula
                                                                    {
                                                                        if (y == true) //valida que despues de la I inicie el nombre en Mayuscula
                                                                        {
                                                                            Resp.Linea = LineaActual;
                                                                            Resp.Respuesta = true;
                                                                            Resp.Mensaje = "Existe buen nombramiento de interface en el archivo en la linea " + LineaActual +
                                                                                ", con la inicial I seguido del nombre en mayuscula, ejemplo: public interface INombreinterface ";
                                                                            /*se verifico que si iniciaba con I y le seguia el nombre iniciando en Mayuscula
                                                                            se emite mensaje indicando el exito del nombre de la interface */
                                                                            Entidad = (Resp as Entidad);
                                                                        }
                                                                        Resp.Linea = LineaActual;
                                                                        Resp.Respuesta = false;
                                                                        Resp.Mensaje = "No existe buen nombramiento de interface en el archivo en la linea " + LineaActual +
                                                                            ", aunque inicia con I, el nombre no inicia en Mayuscula, ejemplo: public interface Inombreinterface ";
                                                                        /*aunque se verifico que si iniciaba con I no le seguia el nombre iniciando en Mayuscula
                                                                          se emite mensaje indicando el error del nombre de la interface */
                                                                        Entidad = (Resp as Entidad);
                                                                    }
                                                                    Resp.Linea = LineaActual;
                                                                    Resp.Respuesta = false;
                                                                    Resp.Mensaje = "No existe buen nombramiento de interface en el archivo en la linea " + LineaActual +
                                                                        ", no inicia con I, ejemplo: public interface Inombreinterface ";
                                                                    /*aunque se verifico que si iniciaba con I no le seguia el nombre iniciando en Mayuscula
                                                                      se emite mensaje indicando el error del nombre de la interface */
                                                                    Entidad = (Resp as Entidad);
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            i++;
                        }

                    }

                }
                Entidad = (Resp as Entidad);//Retornamos respuesta.
            }
            catch (Exception e)
            {
                Resp.Linea = LineaActual;
                Resp.Respuesta = false;
                Resp.Mensaje = "Ocurrio un error inesperado al leer la linea " + LineaActual + ". Error " + e.Message;
                Entidad = (Resp as Entidad);
            }
        }

    }
}
